package com.yls.except.task;

import com.yls.except.util.StringIsempty;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by xufan on 2016/11/23.
 */
public class RedisCash {
    //    public  static Jedis JEDIS = new Jedis("localhost", 6379, 30000);
    private static Jedis JEDIS;
    private static JedisPool jedisPool;

    static {
        try {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(200);
            jedisPoolConfig.setTestOnBorrow(true);
            jedisPoolConfig.setMaxActive(-1);
            jedisPoolConfig.setMaxWait(30000);
            jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 30000);
        } catch (Exception e) {

        }
    }

    /**
     * String存入缓存
     *
     * @param key   键
     * @param value 值
     */
    public static void redisString(String key, String value) {
        JEDIS = jedisPool.getResource();
        JEDIS.set(key, value);
        recycleJedisOjbect(JEDIS);
    }

    /**
     * map存入缓存
     *
     * @param key   键
     * @param value 值
     */
    public static void redisMap(String key, Map<String, String> value) {
        JEDIS = jedisPool.getResource();
        JEDIS.hmset(key, value);
        recycleJedisOjbect(JEDIS);
    }

    /**
     * list存入缓存
     *
     * @param key  键
     * @param list 值
     */
    public static void redisList(String key, List<String> list) {
        JEDIS = jedisPool.getResource();
        if (!StringIsempty.isNullList(list)) {
            for (int i = 0; i < list.size(); i++)
                JEDIS.lpush(key, list.get(i));
        }
        recycleJedisOjbect(JEDIS);
    }

    /**
     * 根据键获取存入String类型的值
     *
     * @param key 键
     * @return 存入缓存的值
     */
    public static String getString(String key) {
        JEDIS = jedisPool.getResource();
        String returnKey = JEDIS.get(key);
        recycleJedisOjbect(JEDIS);
        return returnKey;
    }

    /**
     * 根据键获取存入Map类型的值
     *
     * @param key 键
     * @return 存入缓存的值
     */
    public static Map<String, String> getMap(String key) {
        JEDIS = jedisPool.getResource();
        Iterator<String> iterator = JEDIS.hkeys(key).iterator();
        Map<String, String> map = new HashMap<String, String>();
        while (iterator.hasNext()) {
            String mapKey = iterator.next();
            map.put(mapKey, JEDIS.hmget(key, mapKey).get(0));
        }
        recycleJedisOjbect(JEDIS);
        return map;
    }

    /**
     * 根据键获取存入list类型的值
     *
     * @param key 键
     * @return
     */
    public static List<String> getList(String key) {
        JEDIS = jedisPool.getResource();
        List<String> list = JEDIS.lrange(key, 0, -1);
        recycleJedisOjbect(JEDIS);
        return list;
    }

    /**
     * 删除键
     *
     * @param key
     */
    public static void removeKey(String key) {
        JEDIS = jedisPool.getResource();
        JEDIS.del(key);
        recycleJedisOjbect(JEDIS);
    }

    /**
     * 删除map中某个值
     *
     * @param key
     * @param mapkey
     */
    public static void removeMapKey(String key, String mapkey) {
        JEDIS = jedisPool.getResource();
        JEDIS.hdel(key, mapkey);
        recycleJedisOjbect(JEDIS);
    }

    /**
     * 删除list中的某个值
     *
     * @param key   键
     * @param value 值
     */
    public static void removeListKey(String key, String value) {
        JEDIS = jedisPool.getResource();
        JEDIS.lrem(key, 1, value);  //1：表示删除的个数
        recycleJedisOjbect(JEDIS);
    }

    /**
     * 归还jedis对象
     * @param jedis
     */
    public static void recycleJedisOjbect(Jedis jedis) {
        jedisPool.returnResource(jedis);
    }
}
